using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml;
using System.Collections;
using System.Diagnostics;
using System.Text.RegularExpressions;

namespace task_runner
{
	class TskCommand
	{
		/// <summary>
		/// Тип команды
		/// run - выполнение
		/// copy - копирование
		/// </summary>
		public string TypeCmd { get; set; }

		public List<Param> Params;


		public TskCommand()
		{
			Params = new List<Param>();
		}

		#region RunApp(string exename) -- Запуск приложение exename
		/// <summary>
		/// Запуск приложение exename
		/// </summary>
		/// <param name="exename">имя файла</param>
		public void RunApp(string exename)
		{
			// This snippet needs the "System.Diagnostics"
			// library

			// Application path and command line arguments
			string ApplicationPath = exename;
			string ApplicationArguments = "";

			// Create a new process object
			Process ProcessObj = new Process();

			// StartInfo contains the startup information of
			// the new process
			ProcessObj.StartInfo.FileName = ApplicationPath;
			ProcessObj.StartInfo.Arguments = ApplicationArguments;

			// These two optional flags ensure that no DOS window
			// appears
			ProcessObj.StartInfo.UseShellExecute = false;
			ProcessObj.StartInfo.CreateNoWindow = false;

			// If this option is set the DOS window appears again :-/
			// ProcessObj.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;

			// This ensures that you get the output from the DOS application
			ProcessObj.StartInfo.RedirectStandardOutput = true;

			// Start the process
			ProcessObj.Start();

			// Wait that the process exits
			ProcessObj.WaitForExit();

			// Now read the output of the DOS application
			string Result = ProcessObj.StandardOutput.ReadToEnd();
		}
		#endregion RunApp

		#region ReplaceParamInFile(string filePath) -- Замена текста в файле
		/// <summary>
		/// Замена текста в файле
		/// </summary>
		/// <param name="filePath">Имя файла.</param>
		public void ReplaceParamInFile(string filePath)
		{
			StreamReader reader = new StreamReader(filePath);
			string content = reader.ReadToEnd();
			reader.Close();
			string searchText;
			string replaceText;
			foreach (Param param in PrjProperty.Params)
			{
				//&path_db#
				searchText = "&" + param.Name + "#";
				replaceText = param.Value;
				content = Regex.Replace(content, searchText, replaceText);
			}
			StreamWriter writer = new StreamWriter(filePath);
			writer.Write(content);
			writer.Close();
		}
		#endregion ReplaceParamInFile

		#region string GetParam(string sName) -- Поиск значения параметра
		/// <summary>
		/// Поиск значения параметра
		/// </summary>
		/// <param name="sName">Имя параметра</param>
		/// <returns>Значения параметра</returns>
		public string GetParam(string sName)
		{
			string ret = "";
			foreach (Param prm in Params)
			{
				if (prm.Name.ToLower() == sName.ToLower())
					ret = prm.Value;
			}
			return ret;
		}
		#endregion GetParam

		#region CopyCmd() -- Команда копирования файла
		/// <summary>
		/// Команда копирования файла
		/// </summary>
		public void CopyCmd()
		{
			#region Получение параметров
			/// <summary>
			/// Параметр для копирования - Использовать подстановку параметров
			/// true - Использовать
			/// false - Нет
			/// </summary>
			bool ParamIsUseParam = GetParam("ParamIsUseParam").ToLower() == "true" ? true : false;

			string CopyToPath = GetParam("CopyToPath");
			string FileName = GetParam("FileName");
			#endregion Получение параметров

			string scopyfrom = FileName;
			string sfname = Path.GetFileName(scopyfrom);
			string scopyto = CopyToPath + "\\" + sfname;
			if (ParamIsUseParam)
			{

				string sfnamenew = PrjProperty.LocalPath + "\\temp\\" + sfname;
				File.Copy(scopyfrom, sfnamenew, true);
				scopyfrom = sfnamenew;
				ReplaceParamInFile(scopyfrom);
			}
			File.Copy(scopyfrom, scopyto, true);
		}
		#endregion CopyCmd

		#region changeparam() -- Изменение(добавление) параметров
		/// <summary>
		/// Изменение(добавление) параметров
		/// </summary>
		public void changeparam()
		{
			#region Получение параметров
			string sName = GetParam("Name");
			string sValue = GetParam("Value");
			#endregion Получение параметров
			bool isNotChange = true;
			foreach (Param prm in PrjProperty.Params)
			{
				if (prm.Name.ToLower() == sName.ToLower())
				{
					isNotChange = false;
					prm.Value = sValue;
				}
			}

			if (isNotChange)
			{
				PrjProperty.Params.Add(new Param()
				{
					Name = sName,
					Value = sValue
				});
			}
			PrjProperty.SaveXMLParam("task-runner.params.xml");
		}
		#endregion changeparam

		#region ReplaceInFile(string filePath, string searchText, string replaceText) -- Замена текста в файле
		/// <summary>
		/// Замена текста в файле
		/// </summary>
		/// <param name="filePath">Имя файла.</param>
		/// <param name="searchText">Текст поиска.</param>
		/// <param name="replaceText">Новый текст.</param>
		public void ReplaceInFile(string filePath, string searchText, string replaceText)
		{
			StreamReader reader = new StreamReader(filePath);
			string content = reader.ReadToEnd();
			reader.Close();
			content = Regex.Replace(content, searchText, replaceText);
			StreamWriter writer = new StreamWriter(filePath);
			writer.Write(content); writer.Close();
		}
		#endregion ReplaceInFile

		public void updater()
		{
			File.Copy(PrjProperty.LocalPath + "\\task-runner-updater.bat", PrjProperty.LocalPath + "\\task-runner-updater-run.bat", true);
			string sFile = GetParam("file");
			ReplaceInFile(PrjProperty.LocalPath + "\\task-runner-updater-run.bat", "&upadename#", sFile);
			Process.Start(PrjProperty.LocalPath + "\\task-runner-updater-run.bat");
			
		}

		#region RunCommand() -- Выполнение команды
		/// <summary>
		/// Выполнение команды
		/// </summary>
		public string RunCommand()
		{
			string ret = "";
			PrjProperty.Logs.Add(TypeCmd + ":");
			if (TypeCmd == "run")
			{
				#region Получение параметров
				string FileName = GetParam("FileName");
				#endregion Получение параметров
				RunApp(FileName);
			}
			if (TypeCmd == "copy")
				CopyCmd();
			if (TypeCmd == "change-param")
				changeparam();
			if (TypeCmd == "update")
			{
				updater();
				ret = "exit;";
			}
			return ret;
		}
		#endregion RunCommand
	}
}
